发布于 

欧拉回路 [构造题]

欧拉回路 [构造题]

Wannafly Day3 D

虽说是构造题,实际这题并没有要求构造,只需输出最值即可。

题目来源:comet OJ

分析

对于这题,我们可以向欧拉回路的性质上去靠。首先我们都知道,欧拉回路的所有的点的度数都为偶数。那么,我们可以首先假设所有的边都被走过了一遍,此时我们可以得到一个此时的所有的点各自的度数的值。

那么,我们的目标便是令这些值都为偶数。方法则为将临近的两个奇数度数的点的连边走的次数+1,此时这两个点的度数都会便为偶数。若它们不相邻,则通过连边可以令度数为奇数的点的位置发生移动,最后移到相邻为止即可。

那么,消去某两个奇数度数点的代价其实就相当于它们之间的曼哈顿距离。而对于题目给出的这个矩形的图,所有奇数点都会出现在非四个顶点位置的四个边上。那么,我们便先将相邻的消掉,然后在对剩下的几个特殊判断处理即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
int n, m;
cin >> n >> m;

int ans = 0;
ans += (n-1) * m + (m-1) * n;

if (n%2==0 && m%2==0)
{
ans += n - 2 + m - 2;
}else if (n%2==1 && m%2==1)
{
ans += n - 3 + m - 3 + 4;
}else if (n%2==0 && m%2==1)
{
ans += n - 2 + m - 3 + min(3, n - 1);
}else if (n%2==1 && m%2==0)
{
ans += n - 3 + m - 2 + min(3, m - 1);
}

cout << ans << endl;
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 [@Songer](https://blog.songer.xyz/) 创建,使用 Stellar 作为主题。